Skip to content

Conversation

@ikseong00
Copy link
Collaborator

@ikseong00 ikseong00 commented Jan 13, 2026

🚀 이슈번호

N/A

✏️ 변경사항

  • 토큰 재발급 로직 및 API 구현
  • refreshToken 추가
  • 게스트 유저 제보 기능 제한
  • 게스트 로그인 시 이미 가입된 계정이면 에러 메시지 표시
  • 게스트 로그인 버튼 UI 복원 및 토스트 메시지 수정
  • 홈 화면 스크롤 최상단 이동 버튼 제거
  • 회원가입 API 요청 형식 변경
  • 회원 탈퇴 완료 시 토큰을 제거하는 것으로 수정
  • 마이페이지 프로필 응답값 수정
  • 조회 createdAt 필드 추가
  • 지도 위치 정보 없을 시 지도 숨김 처리
  • 보호 장소 UI 수정
  • 하단바(BNV) 노출 로직 수정
  • 보호장소, 발견장소 데이터 수정
  • 디스코드 에러 로깅 범위 수정
  • 메인 컬러 변경
  • 스플래시 화면 레거시 색상 적용
  • 온보딩 프로필 설정 로직 제거
  • bg_radius_20 배경 색상 제거
  • 앱 버전 정보 업데이트

📷 스크린샷

✍️ 사용법

🎸 기타

QA 수정사항을 반영한 브랜치입니다.

Summary by CodeRabbit

릴리스 노트 v1.0.12

  • 새로운 기능

    • 게스트 로그인 기능 개선 및 토큰 갱신 시스템 추가
    • 검색 결과에 등록/발견 날짜 정보 표시
  • 버그 수정

    • 좌표 미존재 시 지도 표시 안정성 개선
    • 프로필 이미지 누락 시 처리 개선
  • UI 개선

    • 기본 색상 업데이트 (#FFA938 → #FF9000)
    • 로그인 화면 사용자 경험 개선
    • 검색 상세 페이지 레이아웃 최적화

✏️ Tip: You can customize this high-level summary in your review settings.

- 기존에 보호장소(tvShelterLocation)에 표시되던 주소(careAddr)를 발견장소(tvValueFoundLocation)로 수정
- 보호장소(tvValueProtectLocation)에는 기존 주소(careAddr)를 표시하도록 수정
- 상세 검색 결과 화면에서 하단바가 보이지 않도록 수정
- `bg_radius_20.xml` drawable에서 배경 색상(@color/gray2)을 제거하여 투명한 배경을 가지도록 수정
- Flow를 사용하여 보호 장소 및 복사 버튼 UI를 유연하게 변경
- 기존 5xx 에러만 로깅하던 것을 4xx 에러도 포함하도록 수정
- 기존의 회색 배경 버튼에서 밑줄이 있는 텍스트 버튼으로 변경
- 상세 정보 화면에서 위도, 경도 값이 null일 경우 지도를 표시하지 않도록 수정합니다.
- 관련 DTO 및 데이터 모델의 위도(latitude), 경도(longitude) 타입을 nullable(Double?)로 변경합니다.
- 로그인 API 응답에 refreshToken을 추가하고 관련 데이터 클래스 및 로직을 수정했습니다.
- 일반 로그인 및 게스트 로그인 시 refreshToken을 저장하도록 구현했습니다.
- 기존 메인 컬러 #FFA938를 #FF9000으로 변경
- 온보딩 과정에서 프로필 이미지를 설정하는 UI 및 관련 로직을 제거하고, 닉네임 설정만 남도록 수정했습니다.
- 스플래시 화면의 배경 색상을 기존 main_color에서 main_color_deprecated로 변경
- 프로필 이미지가 없는 경우를 대비하여 MyNickNameResponseDto의 profileImage 타입을 nullable로 변경하고, null일 경우 빈 문자열을 반환하도록 MyProfileMapper 수정
- Multipart 형식에서 JSON 형식으로 변경
- `PostUserRequestDto` 추가
- ReissueService 인터페이스와 관련 DTO 추가
- 액세스 토큰 및 리프레시 토큰 재발급 기능 구현
- AccessToken 만료 시 RefreshToken을 사용하여 자동으로 토큰을 재발급하는 로직을 추가했습니다.
- 토큰 재발급 전용 Retrofit, Service, Authenticator를 DI(Dependency Injection)를 통해 구성했습니다.
- 회원가입 성공 시 발급된 AccessToken과 RefreshToken을 로컬에 저장하도록 수정했습니다.
- 404 에러를 처리하기 위한 `ApiNotFoundException` 추가
- ApiResponseHandler에서 404 코드를 받으면 `ApiNotFoundException`을 발생시키도록 수정
- 게스트 로그인 실패 시 `ApiNotFoundException`인 경우, "가입된 계정이 있습니다. 카카오 계정으로 로그인해주세요." 라는 에러 메시지를 표시하도록 구현
- 게스트 로그인 여부를 저장하고 확인하는 로직을 추가했습니다.
  - `UserInfoRepository` 및 `DeviceLocalDataSource`에 `isGuestLogin` 관련 함수/변수 추가
  - 로그인 및 회원가입 시 `isGuestLogin` 상태를 `false`로 설정
  - 게스트 로그인 시 `isGuestLogin` 상태를 `true`로 설정
- 홈 화면에서 제보하기 관련 기능(실종/발견 제보, 제보 다이얼로그)을 사용할 때, 게스트 유저일 경우 "로그인을 하고 제보해주세요!" 라는 토스트 메시지를 표시하도록 수정했습니다.
- 홈 화면에서 스크롤을 최상단으로 이동시키는 버튼과 관련 로직을 제거했습니다.
- `HomeScrollToTopButton` 컴포저블을 삭제했습니다.
- `HomeScreen`에서 스크롤 위치에 따라 버튼을 표시하는 로직을 제거했습니다.
- `HomeViewModel`에서 버튼 표시 여부를 관리하던 `isScrollToTopVisible` 상태와 관련 이벤트를 삭제했습니다.
- 앱의 `versionCode`를 12에서 13으로, `versionName`을 "1.0.11"에서 "1.0.12"로 업데이트했습니다.
@coderabbitai
Copy link

coderabbitai bot commented Jan 13, 2026

Walkthrough

인증 토큰 재발급 메커니즘을 업그레이드하고, 게스트 로그인 상태 추적을 추가하며, 검색 결과 UI 개선 및 테마 색상을 변경했습니다. Interceptor 기반 인증 로직을 Authenticator 패턴으로 전환하고, 게스트 로그인 여부를 로컬 저장소에 지속하며, 검색 상세 페이지에 생성일 정보를 표시합니다.

Changes

Cohort / File(s) 변경 사항
인증 및 토큰 관리
app/src/main/java/com/kuit/findu/data/dataremote/util/AuthAuthenticator.kt, app/src/main/java/com/kuit/findu/data/dataremote/service/ReissueService.kt, app/src/main/java/com/kuit/findu/data/dataremote/model/request/TokenReissueRequestDto.kt, app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/TokenReissueResponseDto.kt, app/src/main/java/com/kuit/findu/data/dataremote/util/ApiResponseHandler.kt
Interceptor 기반 인증에서 Authenticator 기반 토큰 재발급 패턴으로 전환. ReissueService를 통한 토큰 리프레시 로직 추가, 404 에러 처리용 ApiNotFoundException 추가
게스트 로그인 상태 추적
app/src/main/java/com/kuit/findu/data/datalocal/datasource/DeviceLocalDataSource.kt, app/src/main/java/com/kuit/findu/data/datalocal/datasourceimpl/DeviceLocalDataSourceImpl.kt, app/src/main/java/com/kuit/findu/domain/repository/UserInfoRepository.kt, app/src/main/java/com/kuit/findu/data/repositoryimpl/UserInfoRepositoryImpl.kt
게스트 로그인 상태를 SharedPreferences에 저장하고 조회하는 메커니즘 추가
게스트 로그인 Use Cases
app/src/main/java/com/kuit/findu/domain/usecase/GetIsGuestLoginUseCase.kt, app/src/main/java/com/kuit/findu/domain/usecase/SetIsGuestLoginUseCase.kt
게스트 로그인 상태 조회 및 설정 use case 추가
도메인 모델 업데이트
app/src/main/java/com/kuit/findu/domain/model/AuthData.kt, app/src/main/java/com/kuit/findu/domain/model/search/SearchData.kt, app/src/main/java/com/kuit/findu/domain/model/search/Detail*Data.kt
토큰 재발급 응답에 refreshToken 추가, 검색 결과에 createdAt 필드 추가, 좌표 필드를 nullable로 변경
원격 API 서비스 및 DTO
app/src/main/java/com/kuit/findu/data/dataremote/service/AuthService.kt, app/src/main/java/com/kuit/findu/data/dataremote/datasourceimpl/AuthRemoteDataSourceImpl.kt, app/src/main/java/com/kuit/findu/data/dataremote/model/request/PostUserRequestDto.kt, app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/LoginResponseDto.kt, app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/GuestLoginResponseDto.kt, app/src/main/java/com/kuit/findu/data/dataremote/model/response/my/MyNickNameResponseDto.kt, app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/SearchResponseDto.kt
Signup 엔드포인트를 Multipart에서 JSON Body로 변환, refreshToken 필드 추가, createdAt 필드 추가, profileImage 필드 nullable화
데이터 매퍼
app/src/main/java/com/kuit/findu/data/mapper/todomain/UserInfoDtoMapper.kt, app/src/main/java/com/kuit/findu/data/mapper/todomain/GuestLoginResponseDtoMapper.kt, app/src/main/java/com/kuit/findu/data/mapper/todomain/SearchResponseDtoMapper.kt, app/src/main/java/com/kuit/findu/data/mapper/todomain/my/MyProfileMapper.kt
refreshToken 및 createdAt 매핑 추가, null profileImage 처리 로직 추가
의존성 주입 설정
app/src/main/java/com/kuit/findu/di/NetworkModule.kt, app/src/main/java/com/kuit/findu/di/ServiceModule.kt, app/src/main/java/com/kuit/findu/di/UseCaseModule.kt, app/src/main/java/com/kuit/findu/di/qualifier/Qualifier.kt
ReissueService 및 ReissueRetrofit 한정자 추가, 게스트 로그인 use cases 제공자 추가
로그인 & 온보딩 화면
app/src/main/java/com/kuit/findu/presentation/ui/login/composeview/LoginScreen.kt, app/src/main/java/com/kuit/findu/presentation/ui/login/viewmodel/LoginViewModel.kt, app/src/main/java/com/kuit/findu/presentation/ui/onboarding/composeview/OnboardingScreen.kt, app/src/main/java/com/kuit/findu/presentation/ui/onboarding/viewmodel/OnboardingViewModel.kt, app/src/main/java/com/kuit/findu/presentation/ui/onboarding/component/OnboardingNickname.kt
게스트 로그인 상태 저장, 토큰 저장 기능 추가, UI 스타일 개선, 에러 메시지 처리 추가
홈 화면
app/src/main/java/com/kuit/findu/presentation/ui/home/composeview/HomeScreen.kt, app/src/main/java/com/kuit/findu/presentation/ui/home/component/HomeScrollToTopButton.kt, app/src/main/java/com/kuit/findu/presentation/ui/home/viewmodel/HomeViewModel.kt
스크롤 상단 이동 버튼 제거, 게스트 상태 확인 로직 추가, 보고서 제출 시 게스트 체크 추가
검색 상세 페이지
app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt, app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt, app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt
좌표가 없을 때 지도 렌더링 조건부 처리, 위치 필드 UI 개선
검색 목록 및 모델
app/src/main/java/com/kuit/findu/presentation/ui/search/adapter/SearchListAdapter.kt, app/src/main/java/com/kuit/findu/presentation/ui/search/model/SearchRv.kt, app/src/main/java/com/kuit/findu/presentation/ui/search/model/SearchRvTag.kt, app/src/main/java/com/kuit/findu/presentation/ui/search/tablayout/Search*.kt
createdAt 필드 추가, Grid 뷰 타입 지원, 날짜 태그 정보 추가
레이아웃 파일
app/src/main/res/layout/item_search_grid_content.xml, app/src/main/res/layout/search_horizontal_content_item.xml, app/src/main/res/layout/fragment_search_detail_protecting.xml, app/src/main/res/layout/activity_splash.xml
생성 및 발견 날짜 필드 추가, Flow 레이아웃 개선, 배경색 업데이트
색상 및 드로어블
app/src/main/res/values/colors.xml, app/src/main/res/values/ic_launcher_background.xml, app/src/main/res/drawable/ic_*.xml, app/src/main/res/drawable/icon_*.xml, app/src/main/res/drawable/search_*.xml
주 색상 #FFA938#FF9000으로 변경, 관련 아이콘 및 배경색 업데이트, deprecated 색상 추가
기타 업데이트
app/src/main/res/values/strings.xml, app/src/main/res/drawable/bg_radius_20.xml, app/src/main/java/com/kuit/findu/presentation/ui/main/MainActivity.kt, app/src/main/java/com/kuit/findu/presentation/ui/my/MyFragment.kt, app/src/main/java/com/kuit/findu/presentation/ui/my/viewmodel/MyViewModel.kt
로그인 토스트 메시지 변경, 하단 네비게이션 표시 여부 조정, 토큰 정리 로직 개선

Sequence Diagram(s)

sequenceDiagram
    participant Client as Client (App)
    participant Authenticator as AuthAuthenticator
    participant ReissueService as ReissueService
    participant AuthService as AuthService
    participant LocalDataSource as TokenLocalDataSource

    Client->>AuthService: API 요청 (old accessToken)
    AuthService-->>Client: 401 Unauthorized
    Client->>Authenticator: authenticate()
    Authenticator->>LocalDataSource: 현재 refreshToken 조회
    LocalDataSource-->>Authenticator: refreshToken
    Authenticator->>ReissueService: postReissueToken(refreshToken)
    ReissueService-->>Authenticator: 새 accessToken, refreshToken
    Authenticator->>LocalDataSource: 새 토큰 저장
    Authenticator->>Client: 새 accessToken로 재시도 요청
    Client->>AuthService: 재시도 API 요청 (new accessToken)
    AuthService-->>Client: 200 OK
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

  • Fix qa #110: AuthAuthenticator 파일 리팩토링 — 기존 Interceptor 패턴에서 새로운 Authenticator 패턴으로의 전환과 직접 연관
  • [Feat] 로그인 API 구현 #77: 인증 로직 전반 수정 — AuthService, AuthRemoteDataSource, 로그인/게스트 로그인 DTO, 매퍼 및 use case 변경이 겹침
  • [Feat] search UI #80: 검색 상세 페이지 지도 렌더링 — SearchDisappearDetailFragment, SearchProtectingDetailFragment, SearchWitnessDetailFragment 동일 파일 수정

Suggested labels

feat, 🐾익성

Suggested reviewers

  • t1nm1ksun
  • nasohee

Poem

토큰을 새로 발급하고 🔄
게스트 상태를 기억하며 👤
색색의 아이콘들을 주황색으로 칠하고 🎨
검색 결과에 날짜를 담아 📅
찾아유는 한 걸음 더 나아갑니다 🐾

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 'fix: QA 수정사항 반영'으로 QA 피드백을 반영한 다양한 변경사항들을 포괄적으로 설명하고 있으나, 매우 광범위한 변경(토큰 재발급, 게스트 기능, UI 수정, 버전 업데이트 등)을 단순한 표현으로 요약하고 있습니다.
Description check ✅ Passed PR 설명이 제공된 템플릿 구조를 부분적으로 따르고 있으며, 변경사항을 상세히 나열하고 있지만 관련 이슈 번호(N/A)와 필수 섹션이 완전하지 않습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/qa

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ikseong00 ikseong00 self-assigned this Jan 13, 2026
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
app/src/main/java/com/kuit/findu/presentation/ui/my/viewmodel/MyViewModel.kt (1)

127-139: clearToken() 호출이 비동기로 실행되어 race condition 발생 가능

clearToken() 함수가 내부적으로 새로운 코루틴을 launch하기 때문에 토큰 삭제가 완료되기 전에 _deleteUserMessage.value가 설정됩니다. ViewModel이 빠르게 destroy되면 토큰이 남아있을 수 있습니다.

🔧 제안하는 수정 방법

방법 1: clearToken()을 suspend 함수로 변경

-    fun clearToken() {
-        viewModelScope.launch {
-            clearTokenUseCase()
-        }
-    }
+    private suspend fun clearToken() {
+        clearTokenUseCase()
+    }

방법 2: deleteUserData()에서 직접 use case 호출

     fun deleteUserData() {
         viewModelScope.launch {
             deleteUserUseCase().fold(
                 onSuccess = {
-                    clearToken()
+                    clearTokenUseCase()
                     _deleteUserMessage.value = "회원 탈퇴가 완료되었습니다."
                 },

외부에서 clearToken()을 호출하는 곳이 있다면 방법 1을 권장합니다.

Also applies to: 248-252

app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt (1)

96-101: 마커 높이 값 불일치 확인

SearchDisappearDetailFragment와 다른 detail fragment들의 마커 높이가 다릅니다. SearchDisappearDetailFragmentheight = 40을 사용하는데, SearchProtectingDetailFragmentSearchWitnessDetailFragmentheight = 23을 사용합니다. 모든 fragment에서 동일한 아이콘을 사용하는데 높이만 다르므로, 의도적인 차이인지 확인이 필요합니다. 의도적이라면 주석으로 설명하고, 그렇지 않다면 일관성 있게 통일하는 것이 좋겠습니다.

app/src/main/res/values/strings.xml (1)

136-137: 파이프라인 경고: date_single 포맷 문자열 수정 필요

이 PR에서 변경된 부분은 아니지만, 파이프라인에서 date_single 문자열의 포맷 관련 경고가 발생하고 있습니다. 여러 substitution이 있는 경우 positional format(%1$d)을 사용하거나 formatted="false" 속성을 추가해야 합니다.

🔧 포맷 문자열 수정 제안
-    <string name="date_single">%d.%d.%d ~</string>
+    <string name="date_single">%1$d.%2$d.%3$d ~</string>
app/src/main/java/com/kuit/findu/presentation/ui/home/composeview/HomeScreen.kt (1)

144-165: homeData!! 강제 언래핑으로 인한 NPE 위험

HomeUiState에서 homeDataHomeData? = null로 정의되어 있어 null이 될 수 있습니다. 그런데 라인 97에서는 ?.let으로 안전하게 null을 처리하면서, 라인 148과 163에서는 !!로 강제 언래핑하고 있습니다. 이 방식은 일관성이 없을 뿐만 아니라, homeData가 null인 상황에서 앱이 크래시됩니다.

라인 148과 163의 uiState.homeData!!.protectAnimalCards, uiState.homeData!!.reportAnimalCardsuiState.homeData?.protectAnimalCards 같이 안전한 호출로 변경하거나, 명시적인 null 체크를 추가하세요.

app/src/main/java/com/kuit/findu/data/dataremote/datasourceimpl/AuthRemoteDataSourceImpl.kt (1)

30-38: 인터페이스에서도 사용하지 않는 매개변수 제거 필요

postSignup 메서드의 profileImageFiledefaultImageName 매개변수가 실제로 API 호출에서 사용되지 않습니다. 인터페이스(AuthRemoteDataSource)에도 같은 매개변수가 선언되어 있으니, 인터페이스와 모든 구현체(AuthRepositoryImpl, AuthRemoteDataSourceImpl)에서 이 매개변수들을 제거하는 것이 좋습니다.

프로필 이미지 업로드 로직을 완전히 제거했다면, 메서드 시그니처도 함께 정리해서 코드를 명확하게 하세요.

🤖 Fix all issues with AI agents
In @app/src/main/java/com/kuit/findu/data/dataremote/service/AuthService.kt:
- Line 17: Remove the now-unused import retrofit2.http.Multipart from
AuthService.kt because postSignup was converted to use @Body (the @Multipart
annotation is no longer applied); delete the import and run an
auto-organize-imports or rebuild to ensure no other references to Multipart
remain, checking the postSignup method signature to confirm it uses @Body only.
- Around line 36-39: The chain passes unused profileImageFile and
defaultImageName parameters all the way to AuthRemoteDataSourceImpl; remove
these unused parameters from signatures and calls across PostSignupUseCase,
AuthRepository, AuthRepositoryImpl, AuthRemoteDataSource, and
AuthRemoteDataSourceImpl, updating method signatures and call sites to only take
the necessary PostUserRequestDto (nickname, kakaoId, deviceId); ensure any
interface implementations match the updated AuthRepository/AuthRemoteDataSource
signatures and run tests to catch any remaining call sites.

In @app/src/main/res/layout/search_horizontal_content_item.xml:
- Around line 92-99: The TextView with id tv_search_found_date_title is missing
a start constraint so it can float; add a clear horizontal constraint such as
app:layout_constraintStart_toStartOf="@id/tv_search_content_date" (or
toStartOf="parent" if alignment to parent is intended) to the
tv_search_found_date_title element so it is properly constrained in the
ConstraintLayout.
🧹 Nitpick comments (21)
app/src/main/java/com/kuit/findu/data/dataremote/util/ErrorTrackingInterceptor.kt (1)

44-52: 4xx 에러도 Discord에 로깅하도록 변경 - 의도된 변경으로 확인됩니다.

변경 자체는 PR 목적에 부합합니다. 다만 몇 가지 개선 포인트가 있습니다:

  1. 메서드 네이밍: logServerError가 이제 4xx 클라이언트 에러도 처리하므로 logApiError 등으로 변경하면 의미가 더 명확해집니다.

  2. 비구조화 코루틴: CoroutineScope(Dispatchers.IO).launch는 라이프사이클에 연결되지 않은 fire-and-forget 패턴입니다. 현재 로깅 용도로는 큰 문제가 없지만, 에러 핸들링이 없어 Discord 로깅 실패 시 조용히 무시됩니다.

♻️ 에러 핸들링 추가 제안 (선택사항)
             if (code in 400..599) {
                 CoroutineScope(Dispatchers.IO).launch {
-                    discordLogger.logServerError(
-                        code = code,
-                        method = request.method,
-                        url = url
-                    )
+                    runCatching {
+                        discordLogger.logServerError(
+                            code = code,
+                            method = request.method,
+                            url = url
+                        )
+                    }.onFailure { e ->
+                        firebaseCrashlytics.recordException(e)
+                    }
                 }
             }
app/src/main/res/layout/fragment_search_detail_protecting.xml (1)

341-356: Flow 참조 뷰의 tools: 속성 사용은 정상 동작함

Flow 위젯에서 constraint_referenced_ids로 참조되는 뷰들은 Flow가 런타임에 위치를 관리하므로 별도 제약조건이 필요 없습니다. 현재 구현은 정상 동작합니다.

다만, tools:layout_editor_absoluteX/Y="0dp" 설정으로 인해 Android Studio 레이아웃 에디터에서 미리보기가 좌측 상단에 겹쳐 보일 수 있어 디자인 확인이 불편할 수 있습니다. 개발 편의를 위해 실제 예상 위치에 가깝게 설정하는 것도 고려해 볼 수 있습니다.

app/src/main/java/com/kuit/findu/presentation/ui/my/viewmodel/MyViewModel.kt (1)

217-235: 사용되지 않는 result 변수

result 변수에 값이 할당되지만 사용되지 않습니다. 불필요한 변수 선언을 제거하면 코드가 더 깔끔해집니다.

✨ 제안
     fun setInterest(id: Long, isInterest: Boolean) {
         viewModelScope.launch {
-            val result = if (isInterest) {
+            if (isInterest) {
                 postInterestAnimalUseCase(id).fold(
                     onSuccess = {},
                     onFailure = {
                         _errorMessage.value = it.message ?: "관심 등록 중 오류가 발생했습니다."
                     }
                 )
             } else {
                 deleteInterestAnimalUseCase(id).fold(
                     onSuccess = {},
                     onFailure = {
                         _errorMessage.value = it.message ?: "관심 해제 중 오류가 발생했습니다."
                     }
                 )
             }
         }
     }
app/src/main/res/layout/search_horizontal_content_item.xml (1)

77-77: 하드코딩된 문자열을 strings.xml로 이동 권장

"등록날짜: ", "발견날짜: " 같은 문자열은 strings.xml에 정의하면 다국어 지원 및 유지보수에 유리해요.

app/src/main/res/layout/item_search_grid_content.xml (2)

68-105: 하드코딩된 문자열을 string 리소스로 추출하는 것을 고려해 주세요.

"등록날짜: ""발견날짜: " 텍스트가 직접 하드코딩되어 있습니다. 향후 다국어 지원이나 유지보수를 위해 strings.xml로 추출하면 좋을 것 같아요.

♻️ 제안된 변경
 <TextView
     android:id="@+id/tv_search_content_date_title"
     ...
-    android:text="등록날짜: "
+    android:text="@string/search_registration_date_label"
     ... />

 <TextView
     android:id="@+id/tv_search_found_date_title"
     ...
-    android:text="발견날짜: "
+    android:text="@string/search_found_date_label"
     ... />

88-95: tv_search_found_date_title에 start constraint가 누락되어 있습니다.

현재 암시적으로 parent start에 정렬되지만, 명시적으로 app:layout_constraintStart_toStartOf="parent"를 추가하면 레이아웃 의도가 더 명확해집니다.

♻️ 제안된 변경
 <TextView
     android:id="@+id/tv_search_found_date_title"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:paddingTop="2dp"
     android:text="발견날짜: "
     android:textAppearance="@style/TextAppearance.FindU.Tag1_SB_12"
+    app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toBottomOf="@id/tv_search_content_date" />
app/src/main/java/com/kuit/findu/presentation/ui/search/adapter/SearchListAdapter.kt (3)

138-144: item.isBookmark 직접 변경은 상태 관리 문제를 일으킬 수 있습니다.

ViewHolder에서 데이터 객체를 직접 변경하면 DiffUtil이 변경 사항을 제대로 감지하지 못할 수 있고, 단방향 데이터 흐름 원칙에 어긋납니다. 리스트가 다시 제출되거나 스크롤로 뷰가 재활용될 때 예기치 않은 UI 상태가 발생할 수 있어요.

북마크 상태 변경은 listener를 통해 ViewModel/Repository로 전달하고, 상태 업데이트 후 리스트를 다시 제출하는 방식을 권장합니다.


155-190: HorizontalVHGridVH 사이에 중복 코드가 많습니다.

두 ViewHolder의 bind() 메서드와 updateBookmarkIcon() 메서드가 거의 동일해요. 공통 로직을 추출하면 유지보수가 편해질 것 같습니다.

♻️ 공통 로직 추출 예시
// BaseVH에 공통 유틸리티 함수 추가
sealed class BaseVH(bindingRoot: ViewGroup) : RecyclerView.ViewHolder(bindingRoot) {
    
    protected fun loadImage(context: android.content.Context, imageView: android.widget.ImageView, imageUrl: String) {
        Glide.with(context)
            .load(imageUrl.replace("http://", "https://"))
            .centerCrop()
            .transform(RoundedCorners(24))
            .into(imageView)
    }
    
    protected fun handleBookmarkClick(
        item: SearchRv,
        bookmarkView: android.widget.ImageView,
        listener: SearchListListener,
        filledRes: Int,
        blankRes: Int
    ) {
        item.isBookmark = !item.isBookmark
        bookmarkView.setImageResource(if (item.isBookmark) filledRes else blankRes)
        listener.onBookmarkClick(item.reportId, item.isBookmark, item.tag.text)
    }
    // ...
}

131-135: URL 스킴 변환 로직을 데이터 레이어로 이동하는 것이 좋습니다.

http://https://로 변환하는 로직이 ViewHolder에 있으면 여러 곳에서 중복될 수 있어요. Mapper나 Repository 레벨에서 처리하면 일관성 있게 관리할 수 있습니다.

app/src/main/java/com/kuit/findu/presentation/ui/onboarding/component/OnboardingNickname.kt (1)

61-62: 주석 처리된 코드 정리 고려

임시로 주석 처리된 코드가 있습니다. 디자인 수정 예정이라면 TODO 이슈로 추적하고, 코드는 삭제하는 것이 좋습니다. 필요 시 git history에서 복원할 수 있습니다.

♻️ 제안된 수정
-        // NOTE: 페이지 아이콘 첫/끝 요소 여백 불균형으로 임시 여백 삽입 (디자인 수정 시 제거 예정)
-//        BaseVectorIcon(vectorResource = R.drawable.ic_onboarding_page_last, modifier = Modifier.padding(start = 4.dp))
+        // TODO: 디자인 수정 시 페이지 아이콘 복원 필요 (ic_onboarding_page_last)
app/src/main/java/com/kuit/findu/domain/repository/UserInfoRepository.kt (1)

8-9: LGTM!

게스트 로그인 상태 관리를 위한 메서드가 기존 패턴(getDeviceId/setDeviceId, getNickname/setNickname)과 일관성 있게 추가되었습니다.

💡 Optional: Kotlin 스타일 네이밍

Kotlin 관례상 Boolean getter는 is prefix를 직접 사용하는 것이 더 자연스럽습니다:

-    fun getIsGuestLogin(): Boolean
-    fun setIsGuestLogin(isGuest: Boolean)
+    fun isGuestLogin(): Boolean
+    fun setGuestLogin(isGuest: Boolean)

다만 기존 패턴과의 일관성을 위해 현재 네이밍도 괜찮습니다.

app/src/main/java/com/kuit/findu/presentation/ui/onboarding/composeview/OnboardingScreen.kt (3)

59-65: 주석 처리된 코드 제거를 권장합니다.

백 버튼과 관련 로직이 주석 처리되어 있습니다. 기능이 영구적으로 제거된 것이라면 주석 대신 코드를 삭제하는 것이 좋습니다. 주석 처리된 코드는 유지보수를 어렵게 만들고 혼란을 야기할 수 있습니다.

또한 110.dp Spacer가 매직 넘버로 사용되고 있는데, 의미 있는 상수로 정의하거나 주석으로 의도를 명시하면 좋겠습니다.


44-49: isNextButtonEnabled 로직 정리가 필요합니다.

pageState == 1 조건은 프로필 페이지가 제거되어 더 이상 도달할 수 없는 상태입니다. 현재 구조에서는 닉네임 페이지만 존재하므로, 불필요한 조건을 제거하고 단순화하는 것이 좋겠습니다.

♻️ 제안하는 수정
     val isNextButtonEnabled by remember(uiState.pageState, uiState.nickNameValidState) {
         derivedStateOf {
-            uiState.pageState == 1 ||
-                    (uiState.pageState == 2 && uiState.nickNameValidState == NicknameValidType.VALID)
+            uiState.nickNameValidState == NicknameValidType.VALID
         }
     }

67-90: 주석 처리된 when 블록을 제거하고 사용되지 않는 파라미터를 정리해 주세요.

OnboardingProfile 관련 로직이 주석 처리되어 있습니다. 만약 프로필 설정 기능이 영구적으로 제거된 것이라면:

  1. 주석 처리된 코드 블록 삭제
  2. 더 이상 필요 없는 파라미터들(cameraIconClicked, clearProfileImage, defaultProfileClicked, backButtonClicked) 제거 검토
  3. OnboardingUiStatepageState, defaultProfileType, profileImageUri 필드 정리 검토

나중에 다시 사용할 계획이라면 TODO 주석과 함께 이슈로 관리하는 것이 좋겠습니다.

app/src/main/java/com/kuit/findu/presentation/ui/login/composeview/LoginScreen.kt (1)

77-88: TextButton으로 게스트 로그인 UI 단순화 - 사용하지 않는 Modifier 제거 권장

TextButton과 밑줄 데코레이션을 사용한 구현이 깔끔합니다. 다만 Line 86의 빈 Modifier는 아무 역할도 하지 않으므로 제거해도 됩니다.

🔧 Modifier 정리 제안
             Text(
                 text = stringResource(R.string.login_without_signup),
                 textAlign = TextAlign.Center,
                 style = FindUTheme.typography.body1SemiBold16,
                 color = FindUTheme.colors.gray5,
                 textDecoration = TextDecoration.Underline,
-                modifier = Modifier
             )
app/src/main/res/layout/activity_splash.xml (1)

11-40: 주석 처리된 레거시 코드 정리 고려.

사용하지 않는 주석 처리된 레이아웃 코드가 남아있습니다. 추후 코드 정리 시 제거를 고려해 주세요.

app/src/main/java/com/kuit/findu/domain/usecase/GetIsGuestLoginUseCase.kt (1)

9-11: 비동기/동기 일관성 확인 필요

SetIsGuestLoginUseCasesuspend 함수인데, 이 use case는 일반 함수입니다. SharedPreferences 읽기가 동기적이라 현재 구현도 동작하지만, 향후 DataStore 등으로 마이그레이션하거나 일관성을 위해 suspend로 통일하는 것도 고려해볼 수 있습니다.

♻️ 선택적 리팩터링 제안
 class GetIsGuestLoginUseCase @Inject constructor(
     private val userInfoRepository: UserInfoRepository
 ) {
-    operator fun invoke(): Boolean {
+    suspend operator fun invoke(): Boolean {
         return userInfoRepository.getIsGuestLogin()
     }
 }
app/src/main/java/com/kuit/findu/presentation/ui/login/viewmodel/LoginViewModel.kt (1)

76-80: 불필요한 중첩 viewModelScope.launch 제거 권장

이미 viewModelScope.launch 코루틴 내부에 있으므로 _errorMessage.emit() 호출 시 추가로 viewModelScope.launch를 감쌀 필요가 없습니다.

♻️ 제안된 수정
                 .onFailure { e ->
-                    if(e is ApiNotFoundException) {
-                        viewModelScope.launch {
-                            _errorMessage.emit("가입된 계정이 있습니다.\n카카오 계정으로 로그인해주세요.")
-                        }
+                    if (e is ApiNotFoundException) {
+                        _errorMessage.emit("가입된 계정이 있습니다.\n카카오 계정으로 로그인해주세요.")
                     }
                     Log.d("http", "Error Message: : $e")
                 }
app/src/main/java/com/kuit/findu/data/dataremote/util/AuthAuthenticator.kt (1)

44-48: 예외 로깅 추가 권장

토큰 재발급 중 발생한 예외가 삼켜지고 있어 디버깅이 어려울 수 있습니다. 최소한 예외를 로깅하는 것이 좋습니다.

♻️ 제안된 수정
             } catch (e: Exception) {
-                // 토큰 재발급 중 오류 발생 - 로그인 화면으로 이동
+                // 토큰 재발급 중 오류 발생 - 로그인 화면으로 이동
+                android.util.Log.e("AuthAuthenticator", "Token reissue failed", e)
                 tokenLocalDataSource.clearToken()
                 null
             }
app/src/main/java/com/kuit/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (1)

115-123: 중복 로직 추출 고려

게스트 체크 및 토스트 메시지 로직이 navigateToLostReport(), navigateToFindReport()에서도 동일하게 반복됩니다. 매직 스트링 "로그인 이후에 제보해주세요!"가 3곳에서 사용되고 있어 상수로 추출하거나 헬퍼 함수로 통합하면 유지보수가 편해질 것 같아요.

♻️ 리팩터링 제안
+private companion object {
+    const val GUEST_REPORT_BLOCKED_MESSAGE = "로그인 이후에 제보해주세요!"
+}
+
+private inline fun executeIfNotGuest(crossinline action: suspend () -> Unit) {
+    viewModelScope.launch {
+        if (getIsGuestLoginUseCase()) {
+            _uiEffect.send(HomeUiEffect.ShowToast(GUEST_REPORT_BLOCKED_MESSAGE))
+        } else {
+            action()
+        }
+    }
+}
app/src/main/java/com/kuit/findu/di/NetworkModule.kt (1)

113-131: ReissueRetrofit OkHttpClient 타임아웃 설정 보완 권장

readTimeout만 설정되어 있고 connectTimeout, writeTimeout이 누락되었습니다. 네트워크 상태가 불안정할 때 연결이 무한정 대기할 수 있어요. 또한 릴리즈 빌드에서 errorTrackingInterceptor가 없어서 토큰 재발급 실패 시 디버깅이 어려울 수 있습니다.

♻️ 타임아웃 설정 추가 제안
     fun providesReissueRetrofit(
         loggingInterceptor: HttpLoggingInterceptor,
+        errorTrackingInterceptor: ErrorTrackingInterceptor,
         json: Json,
     ): Retrofit {
         val authOkHttpClient = OkHttpClient.Builder().apply {
+            connectTimeout(10, TimeUnit.SECONDS)
+            writeTimeout(10, TimeUnit.SECONDS)
             readTimeout(20, TimeUnit.SECONDS)
             if (DEBUG) addInterceptor(loggingInterceptor)
+            else addInterceptor(errorTrackingInterceptor)
         }.build()
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0b179ef and 3bfa6be.

📒 Files selected for processing (76)
  • app/build.gradle.kts
  • app/src/main/java/com/kuit/findu/data/datalocal/datasource/DeviceLocalDataSource.kt
  • app/src/main/java/com/kuit/findu/data/datalocal/datasourceimpl/DeviceLocalDataSourceImpl.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/datasourceimpl/AuthRemoteDataSourceImpl.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/exception/ApiNotFoundException.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/request/PostUserRequestDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/request/TokenReissueRequestDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/GuestLoginResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/LoginResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/TokenReissueResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/my/MyNickNameResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/DetailMissingResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/DetailProtectResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/DetailWitnessResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/SearchResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/service/AuthService.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/service/ReissueService.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/util/ApiResponseHandler.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/util/AuthAuthenticator.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/util/ErrorTrackingInterceptor.kt
  • app/src/main/java/com/kuit/findu/data/mapper/todomain/GuestLoginResponseDtoMapper.kt
  • app/src/main/java/com/kuit/findu/data/mapper/todomain/SearchResponseDtoMapper.kt
  • app/src/main/java/com/kuit/findu/data/mapper/todomain/UserInfoDtoMapper.kt
  • app/src/main/java/com/kuit/findu/data/mapper/todomain/my/MyProfileMapper.kt
  • app/src/main/java/com/kuit/findu/data/repositoryimpl/UserInfoRepositoryImpl.kt
  • app/src/main/java/com/kuit/findu/di/NetworkModule.kt
  • app/src/main/java/com/kuit/findu/di/ServiceModule.kt
  • app/src/main/java/com/kuit/findu/di/UseCaseModule.kt
  • app/src/main/java/com/kuit/findu/di/qualifier/Qualifier.kt
  • app/src/main/java/com/kuit/findu/domain/model/AuthData.kt
  • app/src/main/java/com/kuit/findu/domain/model/search/DetailMissingData.kt
  • app/src/main/java/com/kuit/findu/domain/model/search/DetailProtectData.kt
  • app/src/main/java/com/kuit/findu/domain/model/search/DetailWitnessData.kt
  • app/src/main/java/com/kuit/findu/domain/model/search/SearchData.kt
  • app/src/main/java/com/kuit/findu/domain/repository/UserInfoRepository.kt
  • app/src/main/java/com/kuit/findu/domain/usecase/GetIsGuestLoginUseCase.kt
  • app/src/main/java/com/kuit/findu/domain/usecase/SetIsGuestLoginUseCase.kt
  • app/src/main/java/com/kuit/findu/domain/usecase/auth/PostSignupUseCase.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/home/component/HomeScrollToTopButton.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/home/composeview/HomeScreen.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/home/viewmodel/HomeViewModel.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/login/composeview/LoginScreen.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/login/viewmodel/LoginViewModel.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/main/MainActivity.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/my/MyFragment.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/my/viewmodel/MyViewModel.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/onboarding/component/OnboardingNickname.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/onboarding/composeview/OnboardingScreen.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/onboarding/viewmodel/OnboardingViewModel.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/adapter/SearchListAdapter.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/model/SearchRv.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/model/SearchRvTag.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/tablayout/SearchAllFragment.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/tablayout/SearchReportFragment.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/search/tablayout/SearchRescueFragment.kt
  • app/src/main/res/drawable/bg_radius_20.xml
  • app/src/main/res/drawable/ic_info_navigate.xml
  • app/src/main/res/drawable/ic_location_pin.xml
  • app/src/main/res/drawable/ic_report_upload_20.xml
  • app/src/main/res/drawable/ic_search_call.xml
  • app/src/main/res/drawable/ic_search_detail_location.xml
  • app/src/main/res/drawable/ic_search_fill_bookmark.xml
  • app/src/main/res/drawable/ic_search_phone.xml
  • app/src/main/res/drawable/icon_home_find_report.xml
  • app/src/main/res/drawable/icon_report_location_map_orange.xml
  • app/src/main/res/drawable/search_detail_phone.xml
  • app/src/main/res/layout/activity_splash.xml
  • app/src/main/res/layout/fragment_search_detail_protecting.xml
  • app/src/main/res/layout/item_search_grid_content.xml
  • app/src/main/res/layout/search_horizontal_content_item.xml
  • app/src/main/res/values/colors.xml
  • app/src/main/res/values/ic_launcher_background.xml
  • app/src/main/res/values/strings.xml
💤 Files with no reviewable changes (4)
  • app/src/main/java/com/kuit/findu/presentation/ui/home/component/HomeScrollToTopButton.kt
  • app/src/main/res/drawable/bg_radius_20.xml
  • app/src/main/java/com/kuit/findu/presentation/ui/main/MainActivity.kt
  • app/src/main/java/com/kuit/findu/presentation/ui/my/MyFragment.kt
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-08-16T15:20:00.175Z
Learnt from: t1nm1ksun
Repo: FindYou-Kuit/FindYou-Android PR: 77
File: app/src/main/java/com/example/findu/data/mapper/todomain/LoginResponseDtoMapper.kt:1-1
Timestamp: 2025-08-16T15:20:00.175Z
Learning: LoginResponseDtoMapper.kt와 관련된 패키지/디렉터리 구조는 이미 올바르게 com.example.findu.data.mapper.todomain으로 통일되어 있다. 초기 분석 시 더 신중하게 확인해야 한다.

Applied to files:

  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/GuestLoginResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/mapper/todomain/UserInfoDtoMapper.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/LoginResponseDto.kt
  • app/src/main/java/com/kuit/findu/data/mapper/todomain/GuestLoginResponseDtoMapper.kt
  • app/src/main/java/com/kuit/findu/data/mapper/todomain/SearchResponseDtoMapper.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/service/AuthService.kt
  • app/src/main/java/com/kuit/findu/domain/model/AuthData.kt
  • app/src/main/java/com/kuit/findu/data/dataremote/datasourceimpl/AuthRemoteDataSourceImpl.kt
🧬 Code graph analysis (2)
app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt (2)
app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt (3)
  • initTagView (228-235)
  • initViewPager (159-176)
  • setupMap (87-102)
app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt (3)
  • initTagView (218-225)
  • initViewPager (153-170)
  • setupMap (85-100)
app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt (2)
app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt (1)
  • setupMap (87-102)
app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt (1)
  • setupMap (87-102)
🪛 detekt (1.23.8)
app/src/main/java/com/kuit/findu/data/dataremote/util/AuthAuthenticator.kt

[warning] 44-44: The caught exception is swallowed. The original exception could be lost.

(detekt.exceptions.SwallowedException)

🪛 GitHub Actions: Android CI
app/src/main/res/values/strings.xml

[warning] 56-56: Multiple substitutions specified in non-positional format of string resource string/date_single. Did you mean to add the formatted="false" attribute?

🔇 Additional comments (72)
app/build.gradle.kts (1)

27-28: LGTM! 버전 업데이트 확인 완료

QA 수정사항 반영에 맞춰 versionCode (12 → 13)와 versionName ("1.0.11" → "1.0.12")이 적절하게 증가되었습니다. 패치 버전 업데이트로 적합합니다.

app/src/main/java/com/kuit/findu/data/dataremote/model/response/my/MyNickNameResponseDto.kt (1)

11-12: LGTM! nullable 처리 적절합니다.

profileImageString?로 변경하고 기본값을 null로 설정한 것은 API 응답에서 프로필 이미지가 없는 경우를 안전하게 처리합니다. kotlinx.serialization에서 이 조합은 JSON 필드 누락 시에도 역직렬화가 정상 동작합니다.

app/src/main/java/com/kuit/findu/data/mapper/todomain/my/MyProfileMapper.kt (1)

6-10: LGTM! Elvis 연산자로 null-safe 매핑 잘 처리했습니다.

profileImage ?: ""로 null을 빈 문자열로 변환하는 것은 도메인 모델의 non-null 타입을 유지하면서 nullable DTO를 처리하는 깔끔한 방법입니다.

다만, UI 레이어에서 빈 문자열일 때 플레이스홀더 이미지를 표시하는 로직이 있는지 확인해 주세요. 이미지 로딩 라이브러리(Coil, Glide 등)에서 빈 문자열 URL 처리 시 에러가 발생할 수 있습니다.

app/src/main/res/layout/fragment_search_detail_protecting.xml (1)

325-339: Flow 위젯 구성 적절함 👍

tv_value_protect_locationcl_protect_location_copy를 반응형으로 배치하기 위한 Flow 위젯 사용이 적절합니다. flow_wrapMode="chain"flow_horizontalStyle="packed" 조합으로 텍스트가 길어질 경우 자연스럽게 줄바꿈되면서 복사 버튼이 따라 배치됩니다.

app/src/main/java/com/kuit/findu/presentation/ui/search/model/SearchRvTag.kt (1)

6-15: LGTM!

태그 타입별로 날짜 라벨을 dateTag 속성으로 깔끔하게 관리하는 구조네요. enum 확장이 잘 되어 있어요.

app/src/main/java/com/kuit/findu/presentation/ui/search/model/SearchRv.kt (1)

12-13: LGTM!

createdAt 필드 추가가 DTO 및 도메인 모델 변경과 일관성 있게 반영되었어요.

app/src/main/java/com/kuit/findu/presentation/ui/search/tablayout/SearchRescueFragment.kt (1)

113-125: LGTM!

SearchAnimal에서 SearchRvcreatedAt 필드 매핑이 올바르게 구현되었어요. 다른 Fragment들과 일관성 있는 변경이네요.

app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/SearchResponseDto.kt (1)

32-33: createdAt 필드의 null 처리 검토 필요

현재 createdAt은 다른 필수 필드(reportId, title, date 등)처럼 non-nullable로 설계되어 있어요. 서버에서 createdAt 값이 누락되거나 null로 반환될 경우 역직렬화 시 예외가 발생할 수 있으니, API 응답 스펙을 기반으로 nullable 타입이나 기본값 설정을 검토해 보세요.

app/src/main/java/com/kuit/findu/domain/model/search/SearchData.kt (1)

11-21: LGTM!

SearchAnimalcreatedAt 필드가 잘 추가되었네요. DTO 매퍼 및 UI 레이어와 일관성 있게 연동되어 있습니다. trailing comma 스타일도 깔끔합니다. 👍

app/src/main/java/com/kuit/findu/presentation/ui/search/tablayout/SearchReportFragment.kt (1)

112-124: LGTM!

setupRV에서 createdAt 필드 매핑이 올바르게 추가되었습니다. SearchAnimalSearchRv 변환 흐름이 다른 Fragment들과 일관성 있게 유지되고 있어요.

app/src/main/java/com/kuit/findu/presentation/ui/search/tablayout/SearchAllFragment.kt (1)

113-125: LGTM!

SearchReportFragment와 동일한 패턴으로 createdAt 매핑이 잘 적용되었습니다. 코드 일관성이 잘 유지되고 있네요. 👍

app/src/main/java/com/kuit/findu/data/mapper/todomain/SearchResponseDtoMapper.kt (1)

20-31: 좋습니다!

createdAt 필드 매핑이 깔끔하게 추가되었네요. DTO와 도메인 모델 모두 non-nullable String으로 정의되어 있어서 현재의 직접 매핑이 정확합니다.

app/src/main/java/com/kuit/findu/presentation/ui/search/adapter/SearchListAdapter.kt (2)

68-86: LGTM!

GRID 뷰 타입 처리가 잘 구현되어 있습니다. ItemSearchGridContentBinding을 사용한 인플레이션과 GridVH 생성이 적절합니다.


120-127: LGTM!

createdAt 필드와 dateTag 바인딩이 PR 목표에 맞게 잘 구현되었습니다. 발견일(date)과 등록일(createdAt)이 구분되어 표시되는 것 확인했어요. 👍

app/src/main/res/drawable/ic_search_fill_bookmark.xml (1)

10-11: LGTM!

메인 컬러 변경(#FFA938 → #FF9000)이 일관되게 적용되었습니다. PR 전체의 색상 테마 업데이트와 일치합니다.

app/src/main/java/com/kuit/findu/di/qualifier/Qualifier.kt (1)

9-15: LGTM!

DeviceIdPrefsReissueRetrofit qualifier 추가가 적절합니다. 특히 ReissueRetrofit은 토큰 재발급 전용 Retrofit 인스턴스를 구분하여 Authenticator에서 순환 의존성 문제를 방지하는 좋은 패턴입니다.

app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/TokenReissueResponseDto.kt (1)

6-12: LGTM!

토큰 재발급 응답 DTO가 깔끔하게 구현되었습니다. kotlinx.serialization 어노테이션이 올바르게 적용되었고, 두 토큰 필드 모두 non-nullable로 설정한 것이 적절합니다.

app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/DetailMissingResponseDto.kt (1)

19-20: 좋습니다!

위치 정보가 없는 경우를 처리하기 위해 latitudelongitude를 nullable로 변경한 것이 적절합니다. PR 목표(위치 정보 없을 시 지도 숨김 처리)와 일치하며, 도메인 레이어와 UI 전역에서 null 좌표를 일관성 있게 처리하고 있습니다.

app/src/main/java/com/kuit/findu/data/dataremote/exception/ApiNotFoundException.kt (1)

1-5: LGTM! 깔끔한 예외 클래스 구현이에요 👍

404 에러를 다른 클라이언트 에러와 구분하기 위한 목적이 명확하고, 구현도 간결합니다.

app/src/main/res/values/ic_launcher_background.xml (1)

3-3: LGTM! 메인 컬러 변경과 일관성 있게 수정되었네요 🎨

#FFA938#FF9000으로 변경되어 앱 전체 컬러 테마 업데이트와 잘 맞춰져 있습니다.

app/src/main/java/com/kuit/findu/data/datalocal/datasource/DeviceLocalDataSource.kt (1)

6-6: LGTM! 게스트 로그인 상태 관리를 위한 속성 추가 👌

기존 deviceId, nickname 패턴과 일관성 있게 isGuestLogin 속성이 추가되었습니다. 게스트 제보 기능 제한 로직에 잘 활용될 것 같네요.

app/src/main/java/com/kuit/findu/domain/model/search/DetailMissingData.kt (1)

16-17: LGTM! 위치 정보 nullable 처리 잘 되었습니다 🗺️

위치 정보가 없는 경우를 처리하기 위해 latitudelongitude를 nullable로 변경한 것이 적절합니다. DTO와 도메인 모델 전반에 걸쳐 일관되게 적용되었네요.

UI 레이어에서 두 값이 모두 null인 경우 지도를 숨기는 로직이 잘 연동되어 있는지 확인해 주세요.

app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/LoginResponseDto.kt (1)

21-24: LGTM! refreshToken 필드 추가 잘 되었습니다 🔐

토큰 재발급 로직 구현을 위한 refreshToken 필드가 적절하게 추가되었습니다. @SerialName 어노테이션도 기존 패턴과 일관성 있게 적용되었네요.

refreshToken이 non-nullable로 선언되어 있는데, 서버 API가 로그인 응답에서 항상 해당 값을 반환하는지 확인해 주세요.

app/src/main/java/com/kuit/findu/domain/model/AuthData.kt (2)

13-17: LGTM! refreshToken 필드 추가 적절합니다.

토큰 재발급 로직 구현을 위해 GuestLoginDatarefreshToken을 추가한 것은 올바른 접근입니다.


19-24: LGTM! UserInfo에 refreshToken 추가 확인.

UserInfo 도메인 모델에 refreshToken을 포함시켜 인증 데이터를 일관되게 관리하도록 한 것은 좋습니다.

app/src/main/java/com/kuit/findu/data/repositoryimpl/UserInfoRepositoryImpl.kt (1)

22-26: LGTM! 게스트 로그인 상태 관리 구현이 깔끔합니다.

DeviceLocalDataSource에 위임하는 방식으로 게스트 로그인 상태를 관리하는 것은 Repository 패턴에 부합합니다.

app/src/main/java/com/kuit/findu/data/datalocal/datasourceimpl/DeviceLocalDataSourceImpl.kt (3)

26-28: LGTM! SharedPreferences 기반 게스트 로그인 상태 저장 구현이 적절합니다.

기본값 false(비게스트 상태)로 설정한 것은 올바른 접근입니다.


30-35: clear() 호출 시 isGuestLogin 상태도 초기화됩니다.

현재 clear() 메서드는 deviceId만 보존하고 나머지(nickname, isGuestLogin 포함)를 모두 초기화합니다. 로그아웃이나 회원 탈퇴 시 게스트 상태도 함께 초기화되는 것이 의도된 동작이라면 문제없지만, 확인 부탁드립니다.


41-41: 상수 정의 확인.

IS_GUEST_LOGIN 키 네이밍이 다른 상수들(deviceId, nickname)과 일관성 있게 camelCase로 작성되어 있습니다.

app/src/main/java/com/kuit/findu/data/mapper/todomain/UserInfoDtoMapper.kt (1)

6-12: LGTM! 매핑이 도메인 모델과 완벽하게 일치합니다.

refreshToken 매핑이 추가되어 UserInfo 도메인 모델 변경과 일관되고, UserInfoDtorefreshToken 필드가 정상적으로 정의되어 있습니다. 모든 필드가 올바르게 매핑되었네요.

app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/DetailProtectResponseDto.kt (1)

30-33: 좋은 접근이네요! 위도/경도 nullable 처리가 일관되게 잘 적용됐습니다.

세 DTO 모두(DetailProtect, DetailMissing, DetailWitness)에서 latitude와 longitude가 Double?로 통일되어 있고, 도메인 모델들도 이미 nullable 타입을 받고 있어서 매퍼에서 자연스럽게 처리됩니다. 타입 시스템이 null 안전성을 보장하고 있으니 따로 명시적인 처리는 필요 없어요.

app/src/main/java/com/kuit/findu/data/dataremote/model/response/search/DetailWitnessResponseDto.kt (1)

15-16: LGTM!

위치 정보가 없는 경우를 처리하기 위해 latitudelongitude를 nullable로 변경한 것은 적절합니다. 다른 상세 응답 DTO(DetailMissingResponseDto, DetailProtectResponseDto)와도 일관성 있게 변경되었네요.

app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchWitnessDetailFragment.kt (1)

142-149: LGTM!

위도/경도가 null인 경우 지도를 숨기는 로직이 잘 구현되었습니다. 스마트 캐스트를 활용하여 setupMap에 non-null 값을 전달하고 있고, SearchDisappearDetailFragment 및 SearchProtectingDetailFragment와 일관된 패턴을 따르고 있네요.

app/src/main/java/com/kuit/findu/domain/usecase/auth/PostSignupUseCase.kt (1)

25-27: LGTM!

회원가입 성공 시 게스트 로그인 상태를 false로 설정하는 로직이 적절합니다. onSuccess를 활용하여 성공 케이스에서만 상태를 업데이트하고, 실패 시에는 기존 상태를 유지하는 것이 올바른 접근입니다.

app/src/main/java/com/kuit/findu/domain/model/search/DetailWitnessData.kt (1)

13-14: LGTM!

DTO의 nullable 좌표 변경이 도메인 모델에도 일관성 있게 반영되었습니다. DetailMissingData, DetailProtectData와 동일한 패턴으로 변경되어 있고, UI 레이어에서 null 체크 후 지도 표시 여부를 결정할 수 있게 되었네요.

app/src/main/java/com/kuit/findu/domain/model/search/DetailProtectData.kt (1)

17-18: LGTM! nullable 좌표 처리가 적절합니다.

위치 정보가 없을 때 지도를 숨기기 위한 nullable 처리가 잘 적용되었습니다. PR 목표에 맞게 DetailProtectResponseDto 및 관련 모델들과 일관성 있게 변경되었네요.

app/src/main/java/com/kuit/findu/data/dataremote/model/request/PostUserRequestDto.kt (1)

1-14: LGTM! 깔끔한 DTO 구현입니다.

JSON 직렬화를 위한 @Serializable 어노테이션과 @SerialName이 적절하게 사용되었습니다. Multipart에서 JSON 요청으로의 전환이 잘 반영되었네요.

app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchProtectingDetailFragment.kt (2)

147-148: LGTM! 위치 데이터 바인딩이 명확해졌습니다.

tvValueProtectLocationcareAddr에, tvValueFoundLocationfoundLocation에 직접 바인딩되어 데이터 매핑이 더 명확해졌습니다.


154-161: LGTM! 좌표 null 체크 로직이 적절합니다.

위도/경도가 null인 경우 지도를 숨기는 처리가 잘 구현되었습니다. 스마트 캐스트를 활용해 setupMap 호출 시 non-null이 보장되네요.

app/src/main/java/com/kuit/findu/presentation/ui/search/detail/SearchDisappearDetailFragment.kt (2)

96-101: 마커 높이 변경 확인.

마커 높이가 40으로 설정되어 있습니다. SearchProtectingDetailFragmentSearchWitnessDetailFragment23을 사용하고 있는데, 이 차이가 의도적인 것인지 확인해 주세요. 모든 상세 화면에서 동일한 마커 크기를 사용해야 한다면 통일이 필요합니다.


148-155: LGTM! 좌표 null 처리가 일관성 있게 구현되었습니다.

SearchProtectingDetailFragment와 동일한 패턴으로 좌표가 없을 때 지도를 숨기는 로직이 잘 적용되었습니다.

app/src/main/java/com/kuit/findu/presentation/ui/login/composeview/LoginScreen.kt (1)

69-74: 카카오 로그인 버튼 클릭 처리 구현 확인

noRippleClickable을 사용하여 카카오 로그인 아이콘에 클릭 핸들러를 연결한 부분이 적절합니다.

app/src/main/res/values/strings.xml (1)

17-17: 환영 메시지 업데이트 확인

게스트 로그인 시 표시되는 토스트 메시지가 사용자 친화적인 환영 메시지로 변경되었습니다.

app/src/main/java/com/kuit/findu/presentation/ui/home/composeview/HomeScreen.kt (1)

212-212: 스크롤 최상단 이동 버튼 제거 확인

PR 목표에 따라 HomeScrollToTopButton 관련 코드가 제거되었습니다. listState는 여전히 LazyColumn에서 사용되므로 유지가 필요합니다.

app/src/main/res/drawable/ic_search_detail_location.xml (1)

8-8: 메인 컬러 변경 적용 확인

#FFA938#FF9000으로 메인 컬러가 업데이트되었습니다. 일관성을 위해 colors.xml에 정의된 @color/main_color를 참조하는 것도 고려해 볼 수 있지만, 벡터 드로어블에서 하드코딩된 색상 사용은 일반적인 패턴이므로 현재 방식도 괜찮습니다.

app/src/main/res/drawable/ic_info_navigate.xml (1)

11-11: strokeColor 메인 컬러 변경 적용

다른 드로어블과 동일하게 메인 컬러가 #FF9000으로 업데이트되었습니다.

app/src/main/res/drawable/icon_home_find_report.xml (1)

11-11: 메인 컬러 업데이트 확인 완료.

새로운 브랜드 컬러 #FF9000으로 strokeColor가 일관되게 변경되었습니다.

app/src/main/res/drawable/ic_location_pin.xml (1)

8-8: LGTM!

위치 핀 아이콘의 fillColor가 새로운 메인 컬러 #FF9000으로 업데이트되었습니다. 다른 아이콘들과 일관성 있게 적용되었네요.

app/src/main/res/drawable/icon_report_location_map_orange.xml (1)

8-8: LGTM!

제보 위치 지도 아이콘도 새로운 메인 컬러로 일관되게 적용되었습니다.

app/src/main/res/drawable/ic_search_call.xml (1)

3-3: LGTM!

전화 아이콘의 fillColor와 strokeColor가 모두 새로운 메인 컬러 #FF9000으로 업데이트되었습니다.

app/src/main/res/layout/activity_splash.xml (1)

8-8: 스플래시 화면 레거시 컬러 적용 확인.

의도적으로 main_color_deprecated를 사용하여 기존 스플래시 화면의 시각적 일관성을 유지한 것으로 보입니다.

app/src/main/res/drawable/ic_report_upload_20.xml (1)

3-3: LGTM!

메인 컬러 팔레트 변경(#FFA938#FF9000)에 맞춰 strokeColor가 잘 업데이트되었습니다.

app/src/main/res/drawable/search_detail_phone.xml (1)

10-11: LGTM!

fillColor와 strokeColor 모두 새로운 메인 컬러(#FF9000)로 일관되게 변경되었습니다.

app/src/main/java/com/kuit/findu/data/dataremote/util/ApiResponseHandler.kt (2)

33-38: BaseResponse와의 일관성 확인 필요.

NullableBaseResponse에만 404 처리가 추가되었고, BaseResponse.handleBaseResponse()에는 동일한 처리가 없습니다. 의도된 설계라면 괜찮지만, 두 함수 간 일관성이 필요한지 확인해 주세요.


34-36: 404 예외 처리 로직은 적절합니다.

게스트 로그인 실패 시 404 응답을 ApiNotFoundException으로 구분하여 처리하는 로직이 잘 구현되었습니다.

app/src/main/res/drawable/ic_search_phone.xml (1)

10-11: LGTM!

메인 컬러 업데이트가 일관되게 적용되었습니다. 👍

app/src/main/java/com/kuit/findu/data/dataremote/model/request/TokenReissueRequestDto.kt (1)

6-10: LGTM!

토큰 재발급 요청을 위한 깔끔한 DTO 구현입니다. @Serializable 어노테이션과 trailing comma 사용도 좋습니다.

app/src/main/res/values/colors.xml (1)

4-5: LGTM! 색상 변경 접근 방식이 좋습니다.

기존 메인 컬러를 main_color_deprecated로 보존하면서 새로운 컬러로 전환하는 방식이 적절합니다. 이렇게 하면 점진적인 마이그레이션이 가능하고 스플래시 화면 등 레거시 참조를 안전하게 유지할 수 있습니다.

app/src/main/java/com/kuit/findu/domain/usecase/SetIsGuestLoginUseCase.kt (1)

6-12: LGTM! 클린 아키텍처 패턴을 잘 따르고 있습니다.

단일 책임 원칙을 준수하며, @Inject 생성자 주입과 suspend operator fun invoke() 패턴이 적절하게 사용되었습니다. GetIsGuestLoginUseCase와 대칭적인 구조로 일관성 있게 구현되었네요.

app/src/main/java/com/kuit/findu/di/ServiceModule.kt (1)

121-124: LGTM! 토큰 재발급용 별도 Retrofit 인스턴스 사용이 적절합니다.

@ReissueRetrofit qualifier를 사용해 별도의 Retrofit 인스턴스를 주입받는 방식이 올바릅니다. 이렇게 하면 AuthAuthenticator에서 토큰 재발급 시 인증 인터셉터가 적용되지 않아 순환 의존성 문제를 방지할 수 있습니다.

app/src/main/java/com/kuit/findu/data/dataremote/service/ReissueService.kt (1)

12-18: LGTM! 토큰 재발급 서비스 인터페이스가 깔끔하게 구현되었습니다.

단일 책임 원칙에 맞게 토큰 재발급만 담당하는 인터페이스로 구성되어 있고, ApiConstraints 상수를 사용한 엔드포인트 정의가 일관성 있습니다. AuthAuthenticator에서 401 응답 처리 시 이 서비스를 통해 토큰을 재발급받는 구조가 잘 설계되었네요.

app/src/main/java/com/kuit/findu/data/mapper/todomain/GuestLoginResponseDtoMapper.kt (1)

6-11: LGTM!

refreshToken 매핑이 올바르게 추가되었습니다. DTO에서 도메인 모델로의 1:1 매핑이 정확합니다.

app/src/main/java/com/kuit/findu/data/dataremote/model/response/auth/GuestLoginResponseDto.kt (1)

6-14: LGTM!

게스트 로그인 응답에 refreshToken 필드가 적절하게 추가되었습니다. @SerialName 어노테이션과 직렬화 설정이 올바릅니다.

app/src/main/java/com/kuit/findu/di/UseCaseModule.kt (1)

296-306: LGTM!

SetIsGuestLoginUseCaseGetIsGuestLoginUseCase 프로바이더가 모듈의 기존 패턴을 따라 올바르게 추가되었습니다. @Singleton 스코프와 UserInfoRepository 의존성 주입이 적절합니다.

app/src/main/java/com/kuit/findu/presentation/ui/onboarding/viewmodel/OnboardingViewModel.kt (2)

131-136: LGTM!

회원가입 성공 시 토큰 저장 및 게스트 플래그 설정이 올바르게 구현되었습니다. setIsGuestLoginUseCase(false)로 게스트가 아님을 명확히 표시하는 것이 적절합니다.


29-30: pageState 기본값 변경 확인

pageState 기본값이 2로 변경되어 프로필 설정 단계가 건너뛰어집니다. PR 목표(온보딩 프로필 설정 로직 제거)와 일치하지만, onBackButtonClicked()에서 FIRST_PAGE로 돌아가는 로직이 아직 존재합니다(Line 67). 현재 플로우에서 뒤로가기 버튼이 노출되지 않는지 확인해주세요.

app/src/main/java/com/kuit/findu/presentation/ui/login/viewmodel/LoginViewModel.kt (1)

42-61: LGTM!

일반 로그인 시 refreshToken 저장과 setIsGuestLoginUseCase(false) 호출이 올바르게 추가되었습니다.

app/src/main/java/com/kuit/findu/data/dataremote/util/AuthAuthenticator.kt (1)

17-52: 토큰 재발급 무한 루프 - 이미 올바르게 처리되고 있음

ReissueService가 @ReissueRetrofit 한정자를 통해 별도의 Retrofit 인스턴스를 사용하고 있으며, 이 인스턴스에는 AuthAuthenticator가 적용되지 않습니다. 따라서 refreshToken이 만료되어 재발급 API가 401을 반환해도 무한 루프가 발생하지 않으며, 예외는 try-catch 블록에서 처리됩니다. 현재 구현이 안전합니다.

app/src/main/java/com/kuit/findu/presentation/ui/home/viewmodel/HomeViewModel.kt (2)

10-10: LGTM! 게스트 로그인 상태 체크를 위한 의존성 추가

GetIsGuestLoginUseCase가 ViewModel에 잘 주입되었습니다.

Also applies to: 89-89


247-265: 게스트 체크 로직 일관성 확인

navigateToLostReport()navigateToFindReport()에서 게스트 체크 로직이 올바르게 구현되었습니다. 다만 OnReportDialogClick 핸들러(Line 116)와 달리 이 함수들은 이미 viewModelScope.launch 블록 안에서 실행되므로, 동일한 패턴으로 통일하면 코드 가독성이 더 좋아질 것 같습니다.

app/src/main/java/com/kuit/findu/di/NetworkModule.kt (2)

59-59: 올바른 Authenticator 패턴 사용

addInterceptor 대신 authenticator()를 사용한 것은 OkHttp의 토큰 재발급 권장 패턴입니다. 401 응답 시 자동으로 재인증을 시도하고 원래 요청을 재시도합니다.


78-85: LGTM! ReissueService 의존성 주입

순환 의존성을 피하기 위해 별도의 ReissueService를 주입받는 구조가 잘 설계되었습니다.

import okhttp3.MultipartBody
import okhttp3.RequestBody
import retrofit2.http.Body
import retrofit2.http.Multipart
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

사용되지 않는 import 제거 필요

@Multipart 어노테이션 import가 더 이상 사용되지 않습니다. postSignup@Body로 변경되면서 불필요해졌네요.

🧹 수정 제안
-import retrofit2.http.Multipart
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import retrofit2.http.Multipart
🤖 Prompt for AI Agents
In @app/src/main/java/com/kuit/findu/data/dataremote/service/AuthService.kt at
line 17, Remove the now-unused import retrofit2.http.Multipart from
AuthService.kt because postSignup was converted to use @Body (the @Multipart
annotation is no longer applied); delete the import and run an
auto-organize-imports or rebuild to ensure no other references to Multipart
remain, checking the postSignup method signature to confirm it uses @Body only.

Comment on lines 36 to 39
@POST("/$API/$VERSION/users")
suspend fun postSignup(
@Part profileImage: MultipartBody.Part?,
@Part("defaultProfileImageName") defaultImageName: RequestBody?,
@Part("nickname") nickname: RequestBody,
@Part("kakaoId") kakaoId: RequestBody,
@Part("deviceId") deviceId: RequestBody
@Body postUserRequestDto: PostUserRequestDto,
): NullableBaseResponse<UserInfoDto>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find PostUserRequestDto.kt
fd -t f "PostUserRequestDto.kt" -x cat {}

Repository: FindYou-Kuit/FindYou-Android

Length of output: 200


🏁 Script executed:

#!/bin/bash
# Check postSignup usage and AuthRemoteDataSourceImpl
rg -n -A 5 "postSignup" --type kotlin

Repository: FindYou-Kuit/FindYou-Android

Length of output: 7469


🏁 Script executed:

#!/bin/bash
# Check AuthService.kt to see the current state
fd -t f "AuthService.kt" -x head -50 {}

Repository: FindYou-Kuit/FindYou-Android

Length of output: 1864


🏁 Script executed:

#!/bin/bash
# Find and examine PostUserRequestDto
fd -t f "PostUserRequestDto.kt" -x cat {}

Repository: FindYou-Kuit/FindYou-Android

Length of output: 413


🏁 Script executed:

#!/bin/bash
# Check if profile image is handled elsewhere in signup flow
rg -n "profileImage|profileImageFile" --type kotlin -i

Repository: FindYou-Kuit/FindYou-Android

Length of output: 11794


회원가입 API JSON 형식 변경 깔끔하게 처리됨

Multipart에서 JSON Body로 변경된 부분이 잘 정리되어 있습니다. PostUserRequestDto는 nickname, kakaoId, deviceId만 담고 있으며, AuthService.postSignup에서 @Body로 깔끔하게 처리되고 있네요.

다만 한 가지 주의할 점이 있습니다: PostSignupUseCase → AuthRepository → AuthRepositoryImpl → AuthRemoteDataSource → AuthRemoteDataSourceImpl으로 이어지는 체인 전체에서 profileImageFile과 defaultImageName 파라미터가 계속 전달되고 있지만, 실제로는 AuthRemoteDataSourceImpl에서 이들을 사용하지 않고 있습니다. 프로필 이미지는 회원가입 후 PatchProfileImageUseCase를 통해 별도로 처리되고 있으므로, 불필요한 파라미터들은 정리하는 것을 고려해보세요.

🤖 Prompt for AI Agents
In @app/src/main/java/com/kuit/findu/data/dataremote/service/AuthService.kt
around lines 36 - 39, The chain passes unused profileImageFile and
defaultImageName parameters all the way to AuthRemoteDataSourceImpl; remove
these unused parameters from signatures and calls across PostSignupUseCase,
AuthRepository, AuthRepositoryImpl, AuthRemoteDataSource, and
AuthRemoteDataSourceImpl, updating method signatures and call sites to only take
the necessary PostUserRequestDto (nickname, kakaoId, deviceId); ensure any
interface implementations match the updated AuthRepository/AuthRemoteDataSource
signatures and run tests to catch any remaining call sites.

Comment on lines +92 to +99
<TextView
android:id="@+id/tv_search_found_date_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="2dp"
android:text="발견날짜: "
android:textAppearance="@style/TextAppearance.FindU.Tag1_SB_12"
app:layout_constraintTop_toBottomOf="@id/tv_search_content_date" />
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

tv_search_found_date_title에 start constraint 누락

tv_search_found_date_titleapp:layout_constraintStart_toStartOf 제약 조건이 없어서 의도치 않은 위치에 렌더링될 수 있어요.

🛠️ 제안하는 수정
 <TextView
     android:id="@+id/tv_search_found_date_title"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:paddingTop="2dp"
     android:text="발견날짜: "
     android:textAppearance="@style/TextAppearance.FindU.Tag1_SB_12"
+    app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toBottomOf="@id/tv_search_content_date" />
🤖 Prompt for AI Agents
In @app/src/main/res/layout/search_horizontal_content_item.xml around lines 92 -
99, The TextView with id tv_search_found_date_title is missing a start
constraint so it can float; add a clear horizontal constraint such as
app:layout_constraintStart_toStartOf="@id/tv_search_content_date" (or
toStartOf="parent" if alignment to parent is intended) to the
tv_search_found_date_title element so it is properly constrained in the
ConstraintLayout.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants